package app_util

import (
	"log"

	"github.com/spf13/viper"

	app_global "app/app_src/framework/app/global"
)

type Config struct {
	// 监听的端口
	HttpPort string
	// 域名 SSL 证书
	CertFile    string
	CertKeyFile string
	// 数据源
	DataSource string
	// 加密盐值
	SecretSalt string
}

// 默认配置文件路径
const _CONFIG_FILE_PREFIX = "resources/app/config/config-"
const _CONFIG_FILE_SUFFIX = ".ini"
const _CONFIG_FILE_DEFAULT = "default"

// ini 配置文件类型
const _CONFIG_TYPE_INI = "ini"

// 配置文件字段
const _CONFIG_FIELD_HTTP_PORT = "default.http_port"
const _CONFIG_FIELD_CERT_FILE = "default.cert_file"
const _CONFIG_FIELD_CERT_KEY_FILE = "default.cert_key_file"
const _CONFIG_FIELD_DATA_SOURCE = "default.data_source"
const _CONFIG_FIELD_SECRET_SALT = "default.secret_salt"

// 根据启动参数获取配置信息
func GetConfigByArgs() *Config {
	args := GetArgs()
	configPath := args.Config

	return GetConfig(configPath)
}

// 获取配置信息
func GetConfig(configPath string) *Config {
	// 解析配置文件
	//
	if configPath == "" {
		embedFS := app_global.EmbedFS()
		env := GetEnv()

		path := _CONFIG_FILE_PREFIX + env + _CONFIG_FILE_SUFFIX
		// 打开文件
		file, err := embedFS.Open(path)

		if err != nil {
			path = _CONFIG_FILE_PREFIX + _CONFIG_FILE_DEFAULT + _CONFIG_FILE_SUFFIX
			// 打开文件
			file, err = embedFS.Open(path)

			if err != nil {
				panic(err)
			}
		}

		// 关闭文件
		defer file.Close()

		viper.SetConfigType(_CONFIG_TYPE_INI)
		// 读取配置文件
		err = viper.ReadConfig(file)

		if err != nil {
			panic(err)
		}
	} else {
		log.Println(`Load custom config "` + configPath + `".`)

		viper.SetConfigFile(configPath)
		// 读取配置文件
		err := viper.ReadInConfig()

		if err != nil {
			panic(err)
		}
	}

	var config Config
	// 获取配置的参数
	config.HttpPort = viper.GetString(_CONFIG_FIELD_HTTP_PORT)
	config.CertFile = viper.GetString(_CONFIG_FIELD_CERT_FILE)
	config.CertKeyFile = viper.GetString(_CONFIG_FIELD_CERT_KEY_FILE)
	config.DataSource = viper.GetString(_CONFIG_FIELD_DATA_SOURCE)
	config.SecretSalt = viper.GetString(_CONFIG_FIELD_SECRET_SALT)

	return &config
}
